package main.leetcode.clockin.November;

import java.util.Arrays;

/**
 * 973. 最接近原点的 K 个点
 *
 * <p>我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。
 *
 * <p>（这里，平面上两点之间的距离是欧几里德距离。）
 *
 * <p>你可以按任何顺序返回答案。除了点坐标的顺序之外，答案确保是唯一的。
 *
 * <p>示例 1： <br>
 * 输入：points = [[1,3],[-2,2]], K = 1 <br>
 * 输出：[[-2,2]] <br>
 * 解释： (1, 3) 和原点之间的距离为 sqrt(10)， (-2, 2) 和原点之间的距离为 sqrt(8)， 由于 sqrt(8) < sqrt(10)，(-2, 2) 离原点更近。
 * 我们只需要距离原点最近的 K = 1 个点，所以答案就是 [[-2,2]]。
 *
 * <p>示例 2：<br>
 * 输入：points = [[3,3],[5,-1],[-2,4]], K = 2 <br>
 * 输出：[[3,3],[-2,4]] （答案 [[-2,4],[3,3]] 也会被接受。）
 *
 * <p>提示：<br>
 * 1 <= K <= points.length <= 10000 <br>
 * -10000 < points[i][0] < 10000 <br>
 * -10000 < points[i][1] < 10000
 */
public class day9 {
    public static void main(String[] args) {
        System.out.println(
                Arrays.deepToString(new day9().kClosest(new int[][] {{1, 3}, {-2, 2}}, 1)));
        System.out.println(
                Arrays.deepToString(
                        new day9().kClosest(new int[][] {{3, 3}, {5, -1}, {-2, 4}}, 2)));
    }

    public int[][] kClosest(int[][] points, int K) {

        Arrays.sort(
                points,
                (o1, o2) -> {
                    int a = o1[0] * o1[0] + o1[1] * o1[1];
                    int b = o2[0] * o2[0] + o2[1] * o2[1];
                    return a - b;
                });
        int[][] res = new int[K][2];
        if (K >= 0) {
            System.arraycopy(points, 0, res, 0, K);
        }
        return res;
    }
}
